﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Activation;
using TOTTO.FINGERPRINT.SERVICIOS.Servicios;
//using TOTTO.FINGERPRINT.SERVICIOS.Utilidades.Complementos;

namespace TOTTO.FINGERPRINT.SERVICIOS
{
    //[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    //[ServiceBehaviorAttribute(IncludeExceptionDetailInFaults = true)]

    public class FingerPrintService : IFingerPrintService
    {

        private const int vcMinutosAddSesion = 8;

        private bool mValidaSesion(clDatosSesionSrv paSesionSrv)
        {
            bool vvRes = false;

            if (paSesionSrv != null)
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var y = from h in p.TFNT_SESIONES
                        where h.SES_SEMPRESA == paSesionSrv.vEmpresa
                        && h.SES_UIDSESION == paSesionSrv.vSesionId
                        && h.SES_DFECHAEXP >= DateTime.Now
                        && h.SES_LCERRADA == false
                        select h;

                if (y.Count() > 0)
                {
                    TFNT_SESIONES t = y.First();

                    t.SES_DFECHAEXP = t.SES_DFECHAEXP.Add(new TimeSpan(0, Convert.ToInt32(vcMinutosAddSesion - (t.SES_DFECHAEXP - DateTime.Now).TotalMinutes), 0));

                    p.SubmitChanges();

                    vvRes = true;
                }
                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }
        
        private bool mVerificaHuella(byte[] paTemplate, ref byte[] paHuella)
        {
            bool vvRes = false;

            try
            {
                if (paTemplate.Length > 0 && paHuella.Length > 0)
                {
                    DPFP.Verification.Verification vvVerification = new DPFP.Verification.Verification();
                    DPFP.Verification.Verification.Result vvResult = new DPFP.Verification.Verification.Result();
                    DPFP.Template vvTemplate = new DPFP.Template();
                    DPFP.FeatureSet vvFeatureSet = new DPFP.FeatureSet();

                    vvTemplate.DeSerialize(paTemplate);
                    vvFeatureSet.DeSerialize(paHuella);

                    vvVerification.Verify(vvFeatureSet, vvTemplate, ref vvResult);

                    vvRes = vvResult.Verified;

                    vvVerification = null;
                    vvResult = null;
                    vvTemplate = null;
                    vvFeatureSet = null;
                }
            }
            catch
            {
                vvRes = false;
            }
            finally
            {
                paTemplate = new byte[0];
            }

            GC.Collect();
            GC.Collect();

            return vvRes;
        }

        public clDatosSesionSrv mConsultarFechaExpSesion(clDatosSesionSrv paSesionSrv)
        {
            clDatosSesionSrv vvRes = null;

            dcConexionDataContext p = new dcConexionDataContext();

            var y = from t in p.TFNT_SESIONES
                    where t.SES_SEMPRESA == paSesionSrv.vEmpresa
                    && t.SES_DFECHAEXP >= DateTime.Now
                    && t.SES_UIDSESION == paSesionSrv.vSesionId
                    select t;

            if (y.Count() > 0)
            {
                paSesionSrv.vFechaExp = y.First().SES_DFECHAEXP;

                vvRes = paSesionSrv;
            }
            p.Connection.Close();
            p.Dispose();
            p = null;
            return vvRes;
        }

        public clSesion mIniciaSesion(short paEmpresa, string paCedula, byte[] paHuella)
        {
            clSesion vvRes = null;
            Guid vvHuellaValidada = Guid.Empty;
            TFNT_COLABORADORES vvColaborador = null;
            int vvDedo = 0;

            dcConexionDataContext p = new dcConexionDataContext();

            if (paHuella.Length > 0)
            {
                for (vvDedo = 0; vvDedo < 10; vvDedo++)
                {
                    vvColaborador = mVerificaHuellaColaborador(paEmpresa, paCedula, vvDedo, ref paHuella);

                    if (vvColaborador != null)
                        break;
                }
            }
            else
            {
                vvColaborador = mConsultaColaboradorTabla(paEmpresa, paCedula);
            }

            if (vvColaborador != null)
            {
                var j = from t in p.TFNT_SESIONESTICKETS
                        where t.SET_SEMPRESA == paEmpresa
                        && t.CLB_VID == vvColaborador.CLB_VID
                        && t.SET_DFECHAEXPIRACION >= DateTime.Now
                        && t.SET_LCERRADO == false
                        select t;

                if (j.Count() > 0)
                {
                    vvHuellaValidada = Guid.NewGuid();

                    foreach (TFNT_SESIONESTICKETS t in j)
                    {
                        t.SET_LCERRADO = true;
                    }

                    p.SubmitChanges();
                }
                else
                {
                    if (!vvColaborador.CLB_LMARCACIONMANUAL)
                    {
                        if (paHuella.Length > 0)
                        {
                            try
                            {
                                var g = from e in p.TFNT_HUELLAS
                                        where e.HLL_SEMPRESA == paEmpresa
                                        && e.CLB_VID == paCedula
                                        && e.HLL_SDEDO == vvDedo
                                        select e.HLL_UHUELLAID;

                                if (g.Count() > 0)
                                    vvHuellaValidada = g.First();

                                g = null;
                            }
                            catch
                            {
                                vvHuellaValidada = Guid.Empty;
                            }
                        }
                    }
                    else
                    {
                        if (paHuella.Length == 0)
                            vvHuellaValidada = Guid.NewGuid();
                    }
                }

                if (vvHuellaValidada != Guid.Empty)
                {
                    try
                    {
                        var t = from e in p.TFNT_PERMISOS
                                where e.PER_SEMPRESA == paEmpresa
                                && e.PRF_UID == vvColaborador.PRF_UID
                                select e;

                        var g = from h in p.TFNT_SESIONES
                                where h.SES_SEMPRESA == paEmpresa
                                && h.SES_DFECHAEXP >= DateTime.Now
                                && h.SES_LCERRADA == false
                                && h.HLL_UHUELLAID == vvHuellaValidada
                                select h;

                        TFNT_SESIONES r = new TFNT_SESIONES();

                        if (g.Count() > 0)
                        {
                            r = g.First();

                            r.SES_DFECHAEXP = r.SES_DFECHAEXP.Add(new TimeSpan(0, Convert.ToInt32(vcMinutosAddSesion - (r.SES_DFECHAEXP - DateTime.Now).TotalMinutes), 0));
                        }
                        else
                        {
                            r.SES_SEMPRESA = paEmpresa;
                            r.SES_UIDSESION = Guid.NewGuid();
                            r.HLL_UHUELLAID = Guid.Empty;
                            r.SES_DFECHAEXP = DateTime.Now.Add(new TimeSpan(0, vcMinutosAddSesion, 0));
                            r.SES_LCERRADA = false;
                            r.SES_DCRCFECHA = DateTime.Now;
                            r.SES_VCRCUSUARIO = paCedula;
                            r.SES_DACTFECHA = DateTime.Now;
                            r.SES_VACTUSUARIO = paCedula;

                            p.TFNT_SESIONES.InsertOnSubmit(r);
                        }

                        p.SubmitChanges();

                        vvRes = new clSesion();

                        vvRes.vDatosSrv.vEmpresa = vvColaborador.CLB_SEMPRESA;
                        vvRes.vDatosSrv.vId = vvColaborador.CLB_VID;
                        vvRes.vNombre = vvColaborador.CLB_VNOMBRE;
                        vvRes.vDatosSrv.vSesionId = r.SES_UIDSESION;

                        //Agrega los permisos a la lista de permisos a devolver.
                        if (t.Count() > 0)
                        {
                            foreach (TFNT_PERMISOS d in t)
                            {
                                vvRes.vPermisos.Add(d.MOD_UID);
                            }
                        }
                        else
                        {
                            vvRes.vPermisos = new List<Guid>();
                        }

                        r = null;
                    }
                    catch
                    {
                        vvRes = null;
                    }
                }
            }
            p.Connection.Close();
            p.Dispose();
            p = null;

            return vvRes;
        }

        public bool mCierraSesion(clSesion paSesion)
        {
            try
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var y = (from h in p.TFNT_SESIONES
                         where h.SES_SEMPRESA == paSesion.vDatosSrv.vEmpresa
                         && h.SES_UIDSESION == paSesion.vDatosSrv.vSesionId
                         select h).Single();

                if (y != null)
                {
                    y.SES_DACTFECHA = DateTime.Now;
                    y.SES_LCERRADA = true;

                    p.SubmitChanges();

                    p.Dispose();

                    return true;
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }
            catch
            {
                return false;
            }

            return false;
        }

        public List<TFNT_EMPRESAS> mConsultarEmpresas()
        {
            List<TFNT_EMPRESAS> vvRes = null;
            dcConexionDataContext p = new dcConexionDataContext();

            var n = from g in p.TFNT_EMPRESAS
                    select g;

            if (n.Count() > 0)
            {
                vvRes = n.ToList();
            }
            
            p.Connection.Close();
            p.Dispose();
            p = null;

            GC.Collect();
            GC.Collect();

            return vvRes;
        }

        public TFNT_EMPRESAS mConsultarEmpresa(short paEmpresa)
        {
            TFNT_EMPRESAS vvRes = null;
            List<TFNT_EMPRESAS> vvEmpresas = mConsultarEmpresas();

            if (vvEmpresas != null)
            {
                var n = from g in vvEmpresas.Where(x => x.EMP_SID == paEmpresa)
                        select g;

                if (n.Count() > 0)
                {
                    vvRes = vvEmpresas.First();
                }
            }

            GC.Collect();
            GC.Collect();

            return vvRes;
        }

        public List<TFNT_MODULOS> mSubNodosDeNodoPadre(clDatosSesionSrv paSesionSrv, Guid paPadre)
        {
            List<TFNT_MODULOS> vvRes = new List<TFNT_MODULOS>();

            if (mValidaSesion(paSesionSrv))
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var n = from g in p.TFNT_MODULOS
                        where g.MOD_UIDPADRE == paPadre
                        select g;

                vvRes = n.ToList();

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public List<TFNT_PERFILES> mObtienePerfiles(clDatosSesionSrv paSesionSrv)
        {
            List<TFNT_PERFILES> vvRes = new List<TFNT_PERFILES>();

            if (mValidaSesion(paSesionSrv))
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var n = from g in p.TFNT_PERFILES
                        where g.PRF_SEMPRESA == paSesionSrv.vEmpresa
                        select g;

                vvRes = n.ToList();

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public List<TFNT_CARGOS> mObtieneCargos(clDatosSesionSrv paSesionSrv)
        {
            List<TFNT_CARGOS> vvRes = new List<TFNT_CARGOS>();

            if (mValidaSesion(paSesionSrv))
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var n = from g in p.TFNT_CARGOS
                        where g.CAR_SEMPRESA == paSesionSrv.vEmpresa
                        select g;

                vvRes = n.ToList();

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public bool mGrabaPermiso(clDatosSesionSrv paSesionSrv, Guid paPerfil, Guid PaModulo)
        {
            bool vvRes = false;

            if (mValidaSesion(paSesionSrv))
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var y = from g in p.TFNT_PERMISOS
                        where g.PER_SEMPRESA == paSesionSrv.vEmpresa
                        && g.PRF_UID == paPerfil
                        && g.MOD_UID == PaModulo
                        select g;

                if (y.Count() == 0)
                {
                    TFNT_PERMISOS p1 = new TFNT_PERMISOS();

                    p1.PER_SEMPRESA = paSesionSrv.vEmpresa;
                    p1.PRF_UID = paPerfil;
                    p1.MOD_UID = PaModulo;
                    p1.PER_DCRCFECHA = DateTime.Now;
                    p1.PER_VCRCUSUARIO = paSesionSrv.vId;
                    p1.PER_DACTFECHA = DateTime.Now;
                    p1.PER_VACTUSUARIO = paSesionSrv.vId;

                    p.TFNT_PERMISOS.InsertOnSubmit(p1);
                }

                try
                {
                    p.SubmitChanges();
                    vvRes = true;
                }
                catch
                {
                    vvRes = false;
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public List<TFNT_MODULOS> mObtenerModulosXPerfil(clDatosSesionSrv paSesionSrv, Guid paPerfil)
        {
            List<TFNT_MODULOS> vvRes = new List<TFNT_MODULOS>();

            if (mValidaSesion(paSesionSrv))
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var n = from d in p.TFNT_MODULOS
                        join h in p.TFNT_PERMISOS on d.MOD_UID equals h.MOD_UID
                        where h.PER_SEMPRESA == paSesionSrv.vEmpresa && h.PRF_UID == paPerfil
                        select d;

                if (n.Count() > 0)
                {
                    vvRes = n.ToList();
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public bool mGrabaPerfil(clDatosSesionSrv paSesionSrv, TFNT_PERFILES paPerfil)
        {
            bool vvRes = false;

            if (mValidaSesion(paSesionSrv))
            {
                if (paPerfil != null)
                {
                    if (paPerfil.PRF_VNOMBRE.Trim().Length > 0)
                    {
                        dcConexionDataContext p = new dcConexionDataContext();

                        var n = from d in p.TFNT_PERFILES
                                where d.PRF_SEMPRESA == paSesionSrv.vEmpresa
                                && d.PRF_VNOMBRE.ToUpper().Contains(paPerfil.PRF_VNOMBRE.ToUpper())
                                select d;

                        if (n.Count() == 0)
                        {
                            paPerfil.PRF_SEMPRESA = paSesionSrv.vEmpresa;
                            paPerfil.PRF_UID = Guid.NewGuid();
                            paPerfil.PRF_VNOMBRE = paPerfil.PRF_VNOMBRE.ToUpper();
                            paPerfil.PRF_DCRCFECHA = DateTime.Now;
                            paPerfil.PRF_VCRCUSUARIO = paSesionSrv.vId;
                            paPerfil.PRF_DACTFECHA = DateTime.Now;
                            paPerfil.PRF_VACTUSUARIO = paSesionSrv.vId;

                            p.TFNT_PERFILES.InsertOnSubmit(paPerfil);

                            try
                            {
                                p.SubmitChanges();

                                vvRes = true;
                            }
                            catch
                            {
                                vvRes = false;
                            }
                        }

                        p.Connection.Close();
                        p.Dispose();
                        p = null;
                    }
                }
            }

            return vvRes;
        }

        public clColaboradorInfo mConsultaColaborador(clDatosSesionSrv paSesionSrv, string paCedula)
        {
            clColaboradorInfo vvRes = null;

            if (mValidaSesion(paSesionSrv))
            {
                vvRes = mConsultaColaborador(paSesionSrv.vEmpresa, paCedula);
            }

            return vvRes;
        }

        private clColaboradorInfo mConsultaColaborador(short paEmpresa, string paCedula)
        {
            clColaboradorInfo vvRes = null;

            bool vvConsultadoEnInterfaz = false;
            TFNT_COLABORADORES vvColaborador = null;
            TFNT_CARGOS vvCargo = null;
            TFNT_HUELLAS[] vvHuellas = null;
            TFNT_PERFILES vvPerfil = null;
            TFNT_MOTIVOMARCACION vvMotivo = null;
            TFNT_MARCACIONES vvMarcacion = null;

            if (paCedula.Trim().Length > 0)
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var y = from t in p.TFNT_COLABORADORES
                        where t.CLB_SEMPRESA == paEmpresa
                        && t.CLB_VID == paCedula
                        select t;

                if (y.Count() > 0)
                {
                    vvColaborador = y.First();

                    if (vvColaborador.CLB_LACTIVO)
                    {
                        var g = from t in p.TFNT_CARGOS
                                where t.CAR_SEMPRESA == paEmpresa
                                && t.CAR_VID == vvColaborador.CAR_VID
                                select t;

                        if (g.Count() > 0)
                        {
                            vvCargo = g.First();
                        }

                        var h = from t in p.TFNT_HUELLAS
                                where t.HLL_SEMPRESA == paEmpresa
                                && t.CLB_VID == vvColaborador.CLB_VID
                                select t;

                        if (h.Count() > 0)
                        {
                            vvHuellas = h.ToArray();
                        }

                        if (vvHuellas == null)
                        {
                            vvHuellas = new TFNT_HUELLAS[0];
                        }

                        var j = from t in p.TFNT_PERFILES
                                where t.PRF_SEMPRESA == paEmpresa
                                && t.PRF_UID == vvColaborador.PRF_UID
                                select t;

                        if (j.Count() > 0)
                        {
                            vvPerfil = j.First();
                        }

                        var u = (from t in p.TFNT_MARCACIONES
                                 where t.MRC_SEMPRESA == paEmpresa
                                 && t.CLB_VID == paCedula
                                 select t).OrderByDescending(x => x.MRC_DFECHAMARCACION);

                        if (u.Count() > 0)
                        {
                            vvMarcacion = u.First();

                            var f = from t in p.TFNT_MOTIVOMARCACION
                                    where t.MMC_SEMPRESA == paEmpresa
                                    && t.MMC_UID == u.First().MMC_UID
                                    select t;

                            if (f.Count() > 0)
                            {
                                vvMotivo = f.First();
                            }
                        }
                        else
                        {
                            vvMotivo = new TFNT_MOTIVOMARCACION();
                            vvMarcacion = new TFNT_MARCACIONES();
                        }
                    }
                }
                else
                {
                    var yi = from t in p.TFNT_INTERFAZ_COLABORADORES
                             where t.CLB_SEMPRESA == paEmpresa
                             && t.CLB_VID == paCedula
                             select t;

                    if (yi.Count() > 0)
                    {
                        vvConsultadoEnInterfaz = true;

                        TFNT_INTERFAZ_COLABORADORES v1 = yi.First();

                        vvColaborador = new TFNT_COLABORADORES() { CLB_SEMPRESA = v1.CLB_SEMPRESA, CLB_VID = v1.CLB_VID, CLB_VNOMBRE = v1.CLB_VNOMBRE, CAR_VID = v1.CAR_VID, CLB_LINTERFAZ = true };

                        var g = from t in p.TFNT_CARGOS
                                where t.CAR_SEMPRESA == paEmpresa
                                && t.CAR_VID == vvColaborador.CAR_VID
                                select t;

                        if (g.Count() > 0)
                        {
                            vvCargo = g.First();
                        }

                        vvHuellas = new TFNT_HUELLAS[10];

                        vvPerfil = new TFNT_PERFILES();

                        vvMotivo = new TFNT_MOTIVOMARCACION();

                        vvMarcacion = new TFNT_MARCACIONES();
                    }
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            if (vvColaborador != null && vvCargo != null && vvHuellas != null && vvMotivo != null && vvMarcacion != null)
            {
                vvRes = new clColaboradorInfo() {vCreadoDesdeInterfaz = vvColaborador.CLB_LINTERFAZ, vConsultadoEnInterfaz = vvConsultadoEnInterfaz, vColaboradorId = vvColaborador.CLB_VID, vColaboradorNombre = vvColaborador.CLB_VNOMBRE, vCargoId = vvCargo.CAR_VID, vCargoNombre = vvCargo.CAR_VNOMBRE.Trim(), vPerfilId = vvPerfil.PRF_UID, vPerfilNombre = vvPerfil.PRF_VNOMBRE, vMarcacionManual = vvColaborador.CLB_LMARCACIONMANUAL, vUltimoMovimiento = vvMotivo.MMC_NATURALEZA, vUltimaFechaMarcacion = vvMarcacion.MRC_DFECHAMARCACION };

                if (vvHuellas.Length > 0)
                {
                    foreach (TFNT_HUELLAS t in vvHuellas)
                    {
                        if (t != null)
                        {
                            vvRes.vHuellas.Add(t.HLL_SDEDO, t.HLL_BDATA.ToArray());
                        }
                    }
                }
            }

            return vvRes;
        }

        private TFNT_COLABORADORES mConsultaColaboradorTabla(short paEmpresa, string paCedula)
        {
            TFNT_COLABORADORES vvRes = null;

            dcConexionDataContext p = new dcConexionDataContext();

            try
            {
                var y = from t in p.TFNT_COLABORADORES
                        where t.CLB_SEMPRESA == paEmpresa
                        && t.CLB_VID == paCedula
                        && t.CLB_LACTIVO == true
                        select t;

                if (y.Count() > 0)
                {
                    vvRes = y.First();
                }
            }
            catch
            {
                vvRes = null;
            }
            finally
            {
                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public bool mGrabaColaborador(clDatosSesionSrv paSesionSrv, TFNT_COLABORADORES paColaborador)
        {
            bool vvRes = false;

            if (mValidaSesion(paSesionSrv))
            {
                if (paColaborador != null)
                {
                    if (paColaborador.CLB_VID.Trim().Length > 0 && paColaborador.CLB_VNOMBRE.Trim().Length > 0)
                    {
                        dcConexionDataContext p = new dcConexionDataContext();

                        var s = from t in p.TFNT_CARGOS
                                where t.CAR_SEMPRESA == paSesionSrv.vEmpresa
                                && t.CAR_VID == paColaborador.CAR_VID
                                select t;

                        if (s.Count() > 0)
                        {
                            if (mObtienePerfiles(paSesionSrv).Where(x => x.PRF_UID == paColaborador.PRF_UID).Count() > 0)
                            {
                                var c = from t in p.TFNT_COLABORADORES
                                        where t.CLB_SEMPRESA == paSesionSrv.vEmpresa
                                        && t.CLB_VID == paColaborador.CLB_VID
                                        select t;

                                if (c.Count() == 0)
                                {
                                    paColaborador.CLB_SEMPRESA = paSesionSrv.vEmpresa;
                                    paColaborador.CLB_VID = paColaborador.CLB_VID.Trim();
                                    paColaborador.CLB_VNOMBRE = paColaborador.CLB_VNOMBRE.Trim().ToUpper();
                                    paColaborador.CLB_LACTIVO = true;
                                    paColaborador.CLB_LMARCACIONMANUAL = paColaborador.CLB_LMARCACIONMANUAL;
                                    paColaborador.CLB_LINTERFAZ = paColaborador.CLB_LINTERFAZ;
                                    paColaborador.CLB_DCRCFECHA = DateTime.Now;
                                    paColaborador.CLB_VCRCUSUARIO = paSesionSrv.vId;
                                    paColaborador.CLB_DACTFECHA = DateTime.Now;
                                    paColaborador.CLB_VACTUSUARIO = paSesionSrv.vId;

                                    try
                                    {
                                        p.TFNT_COLABORADORES.InsertOnSubmit(paColaborador);
                                        p.SubmitChanges();

                                        vvRes = true;
                                    }
                                    catch
                                    {
                                        vvRes = false;
                                    }
                                }
                                else
                                {
                                    try
                                    {
                                        TFNT_COLABORADORES vvC = c.First();

                                        vvC.CLB_LMARCACIONMANUAL = paColaborador.CLB_LMARCACIONMANUAL;
                                        vvC.CAR_VID = paColaborador.CAR_VID;
                                        /*
                                        if (paColaborador.CLB_LMARCACIONMANUAL)
                                        {
                                            var h = from t in p.TFNT_HUELLAS
                                                    where t.HLL_SEMPRESA == paSesionSrv.vEmpresa
                                                    && t.CLB_VID == paColaborador.CLB_VID
                                                    select t;

                                            if (h.Count() > 0)
                                            {
                                                p.TFNT_HUELLAS.DeleteAllOnSubmit(h);
                                            }
                                        }*/

                                        vvC.PRF_UID = paColaborador.PRF_UID;
                                        vvC.CLB_DACTFECHA = DateTime.Now;
                                        vvC.CLB_VACTUSUARIO = paSesionSrv.vId;

                                        p.SubmitChanges();

                                        vvRes = true;
                                    }
                                    catch
                                    {
                                        vvRes = false;
                                    }
                                }
                            }
                        }

                        p.Connection.Close();
                        p.Dispose();
                        p = null;
                    }
                }
            }

            return vvRes;
        }

        public int mGrabaHuella(clDatosSesionSrv paSesionSrv, TFNT_HUELLAS paHuella)
        {
            int vvRes = -1;

            if (mValidaSesion(paSesionSrv))
            {
                if (paHuella != null)
                {
                    if (paHuella.CLB_VID.Trim().Length > 0 && paHuella.HLL_SDEDO > -1 && paHuella.HLL_SDEDO < 10 && paHuella.HLL_BDATA.Length > 0)
                    {
                        dcConexionDataContext p = new dcConexionDataContext();

                        var c = from t in p.TFNT_COLABORADORES
                                where t.CLB_SEMPRESA == paSesionSrv.vEmpresa
                                && t.CLB_VID == paHuella.CLB_VID
                                select t;

                        if (c.Count() > 0)
                        {
                            var t = from f in p.TFNT_HUELLAS
                                    where f.HLL_SEMPRESA == paSesionSrv.vEmpresa
                                    && f.CLB_VID == paHuella.CLB_VID
                                    && f.HLL_SDEDO == paHuella.HLL_SDEDO
                                    select f;

                            try
                            {
                                if (t.Count() > 0)
                                {
                                    t.First().HLL_BDATA = paHuella.HLL_BDATA;
                                }
                                else
                                {
                                    TFNT_HUELLAS d1 = new TFNT_HUELLAS();

                                    d1.HLL_SEMPRESA = paSesionSrv.vEmpresa;
                                    d1.CLB_VID = paHuella.CLB_VID;
                                    d1.HLL_SDEDO = paHuella.HLL_SDEDO;
                                    d1.HLL_UHUELLAID = Guid.NewGuid();
                                    d1.HLL_BDATA = paHuella.HLL_BDATA;
                                    d1.HLL_DCRCFECHA = DateTime.Now;
                                    d1.HLL_VCRCUSUARIO = paSesionSrv.vId;
                                    d1.HLL_DACTFECHA = DateTime.Now;
                                    d1.HLL_VACTUSUARIO = paSesionSrv.vId;

                                    p.TFNT_HUELLAS.InsertOnSubmit(d1);
                                }

                                p.SubmitChanges();

                                vvRes = paHuella.HLL_SDEDO;
                            }
                            catch
                            {
                                vvRes = -1;
                            }
                        }

                        p.Connection.Close();
                        p.Dispose();
                        p = null;
                    }
                }
            }

            return vvRes;
        }

        public int mBorraHuella(clDatosSesionSrv paSesionSrv, TFNT_HUELLAS paHuellas)
        {
            int vvRes = -1;

            if (mValidaSesion(paSesionSrv))
            {
                if (paHuellas != null)
                {
                    try
                    {
                        dcConexionDataContext p = new dcConexionDataContext();

                        var y = from g in p.TFNT_HUELLAS
                                where g.HLL_SEMPRESA == paSesionSrv.vEmpresa
                                && g.CLB_VID == paHuellas.CLB_VID
                                && g.HLL_SDEDO == paHuellas.HLL_SDEDO
                                select g;

                        if (y.Count() > 0)
                        {
                            p.TFNT_HUELLAS.DeleteOnSubmit(y.First());

                            vvRes = paHuellas.HLL_SDEDO;
                        }

                        p.SubmitChanges();

                        p.Connection.Close();
                        p.Dispose();
                        p = null;
                    }
                    catch (Exception e)
                    {
                        vvRes = -1;
                    }
                }

            }

            return vvRes;
        }

        public clColaboradorInfo mMarcacion(short paEmpresa, string paCedula, byte[] paHuella, string paCentroCosto, int paDataDv, byte[] paDataVer)
        {
            clColaboradorInfo vvRes = null;

            if (paHuella != null && paCentroCosto != null && paDataVer != null)
            {
                clMarcacionVer v1 = new clMarcacionVer(paDataDv, paDataVer);

                if (v1.vCads.Count >= 4)
                {
                    Guid vvLectorId = Guid.Empty;
                    Guid vvMaquinaId = Guid.Empty;

                    if (Guid.TryParse(v1.vCads[1], out vvLectorId) && Guid.TryParse(v1.vCads[3], out vvMaquinaId))
                    {
                        TFNT_COLABORADORES vvColaborador = null;
                        TFNT_LECTORES vvLector = null;

                        dcConexionDataContext p = new dcConexionDataContext();

                        try
                        {
                            vvColaborador = mConsultaColaboradorTabla(paEmpresa, paCedula);

                            var y = from h in p.TFNT_LECTORES
                                    where h.LEC_SEMPRESA == paEmpresa
                                    && h.LEC_UID == vvLectorId
                                    && h.LEC_VID2 == v1.vCads[0]
                                    && h.LEC_UMAC == vvMaquinaId
                                    && h.LEC_VMAC2 == v1.vCads[2]
                                    && h.LEC_LRECACT == true
                                    && h.CDC_VID == paCentroCosto
                                    select h;

                            if (y.Count() > 0)
                            {
                                vvLector = y.First();

                                if (paCedula.Length > 0)
                                {
                                    //Busqueda por la cedula si se envió

                                    for (int vvDedo = 0; vvDedo < 10; vvDedo++)
                                    {
                                        vvColaborador = mVerificaHuellaColaborador(paEmpresa, paCedula, vvDedo, ref paHuella);

                                        if (vvColaborador != null)
                                        {
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    //Marcación por huella sin cedula especificada.
                                    if (paHuella.Length > 0)
                                    {
                                        //Busca las marcaciones de un mes para poder encontrar mas rapido el empleado, si no funciona, trae todas las huellas y las compara.
                                        var vvIdEmpleados = (from h in p.TFNT_MARCACIONES
                                                             join d in
                                                                 (from z in p.TFNT_COLABORADORES
                                                                  where z.CLB_SEMPRESA == paEmpresa
                                                                  && z.CLB_LACTIVO == true
                                                                  select z) on h.CLB_VID equals d.CLB_VID
                                                             where h.MRC_SEMPRESA == paEmpresa
                                                             && h.LEC_URECID == vvLector.LEC_URECID
                                                             && h.MRC_DFECHAMARCACION >= DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0))
                                                             select h.CLB_VID).Distinct();

                                        foreach (string vvIdEmpleado in vvIdEmpleados)
                                        {
                                            for (int vvDedo = 0; vvDedo < 10; vvDedo++)
                                            {
                                                vvColaborador = mVerificaHuellaColaborador(paEmpresa, vvIdEmpleado, vvDedo, ref paHuella);

                                                if (vvColaborador != null)
                                                {
                                                    break;
                                                }
                                            }

                                            if (vvColaborador != null)
                                            {
                                                break;
                                            }
                                        }

                                        List<string> vvIdEmp = vvIdEmpleados.ToList();

                                        vvIdEmpleados = null;

                                        if (vvColaborador == null)
                                        {
                                            //Busca las marcaciones del centro de costo, podria tener asociado otro lector
                                            vvIdEmpleados = (from h in p.TFNT_MARCACIONES
                                                             join d in
                                                                 (from z in p.TFNT_LECTORES
                                                                  where z.LEC_SEMPRESA == paEmpresa
                                                                  && z.CDC_VID == vvLector.CDC_VID
                                                                  select z) on h.LEC_URECID equals d.LEC_URECID
                                                             where h.MRC_SEMPRESA == paEmpresa
                                                             && !vvIdEmp.Contains(h.CLB_VID)
                                                             && h.MRC_DFECHAMARCACION >= DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0))
                                                             select h.CLB_VID).Distinct();

                                            foreach (string vvIdEmpleado in vvIdEmpleados)
                                            {
                                                for (int vvDedo = 0; vvDedo < 10; vvDedo++)
                                                {
                                                    vvColaborador = mVerificaHuellaColaborador(paEmpresa, vvIdEmpleado, vvDedo, ref paHuella);

                                                    if (vvColaborador != null)
                                                    {
                                                        break;
                                                    }
                                                }

                                                if (vvColaborador != null)
                                                {
                                                    break;
                                                }
                                            }

                                            vvIdEmp.AddRange(vvIdEmpleados);

                                            vvIdEmpleados = null;
                                        }

                                        //Si no encuentra en las ultimas marcaciones que se han hecho en ese lector, busca la identificacion en todos los dedos registrados en la BD que coincidan
                                        //con el dedo que se leyó. (omitido por requerimiento)
                                        if (vvColaborador == null)
                                        {
                                            for (int vvDedo = 0; vvDedo < 10; vvDedo++)
                                            {
                                                vvIdEmpleados = (from z in p.TFNT_COLABORADORES
                                                                 join d in
                                                                     (from g in p.TFNT_HUELLAS where g.HLL_SEMPRESA == paEmpresa && g.HLL_SDEDO == vvDedo select g) on z.CLB_VID equals d.CLB_VID
                                                                 where z.CLB_SEMPRESA == paEmpresa
                                                                && z.CLB_LACTIVO == true
                                                                && !vvIdEmp.Contains(z.CLB_VID)
                                                                 select z.CLB_VID).Distinct();

                                                foreach (string vvIdEmpleado in vvIdEmpleados)
                                                {

                                                    vvColaborador = mVerificaHuellaColaborador(paEmpresa, vvIdEmpleado, vvDedo, ref paHuella);

                                                    if (vvColaborador != null)
                                                    {
                                                        break;
                                                    }
                                                }

                                                if (vvColaborador != null)
                                                {
                                                    break;
                                                }

                                                vvIdEmpleados = null;
                                            }

                                            vvIdEmp = null;
                                        }
                                    }
                                }

                                if (vvColaborador != null)
                                {
                                    if (vvColaborador.CLB_LMARCACIONMANUAL)
                                    {
                                        vvColaborador = null;
                                    }
                                }
                            }
                        }
                        catch
                        {
                            vvColaborador = null;
                        }

                        if (vvColaborador != null && vvLector != null)
                        {
                            try
                            {
                                var y = (from t in p.TFNT_MARCACIONES
                                         where t.MRC_SEMPRESA == paEmpresa
                                         && t.CLB_VID == vvColaborador.CLB_VID
                                         select t).OrderByDescending(x => x.MRC_DFECHAMARCACION);

                                Guid vvMovimiento = new Guid("EF2DB928-2E8B-4493-B0C3-A0408DC4181C");
                                string vvTipoMovimiento = "E";

                                if (y.Count() > 0)
                                {
                                    if (y.First().MMC_UID == vvMovimiento)
                                    {
                                        vvMovimiento = new Guid("8AF4B629-DC88-4631-A841-8989BE96BE7C");
                                        vvTipoMovimiento = "S";
                                    }
                                }

                                TFNT_MARCACIONES vvMarcacion = null;

                                vvMarcacion = new TFNT_MARCACIONES();

                                vvMarcacion.MRC_SEMPRESA = paEmpresa;
                                vvMarcacion.MRC_UID = Guid.NewGuid();
                                vvMarcacion.MRC_DFECHAMARCACION = DateTime.Now;
                                vvMarcacion.LEC_URECID = vvLector.LEC_URECID;
                                vvMarcacion.CLB_VID = vvColaborador.CLB_VID;
                                vvMarcacion.CLB_LMARCACIONMANUAL = vvColaborador.CLB_LMARCACIONMANUAL;
                                vvMarcacion.MMC_UID = vvMovimiento;
                                vvMarcacion.MRC_DCRCFECHA = DateTime.Now;
                                vvMarcacion.MRC_VCRCUSUARIO = vvColaborador.CLB_VID;
                                vvMarcacion.MRC_DACTFECHA = DateTime.Now;
                                vvMarcacion.MRC_VACTUSUARIO = vvColaborador.CLB_VID;

                                p.TFNT_MARCACIONES.InsertOnSubmit(vvMarcacion);

                                p.SubmitChanges();

                                try
                                {
                                    p.p_graba_marcaciones_kactus(Convert.ToDecimal(vvColaborador.CLB_VID), Convert.ToInt16(vvLector.CDC_VID), vvMarcacion.MRC_DFECHAMARCACION, Convert.ToInt16(vvMarcacion.MRC_DFECHAMARCACION.Hour), Convert.ToInt16(vvMarcacion.MRC_DFECHAMARCACION.Minute), vvTipoMovimiento, vvLector.LEC_URECID.ToString().Substring(0, 10));
                                }
                                catch
                                {

                                }

                                vvRes = mConsultaColaborador(paEmpresa, vvMarcacion.CLB_VID);
                            }
                            catch
                            {
                                vvRes = null;
                            }
                        }

                        vvColaborador = null;
                        vvLector = null;
                        p.Connection.Close();
                        p.Dispose();
                        p = null;
                    }
                }

                v1 = null;
            }

            GC.Collect();
            GC.Collect();

            return vvRes;
        }
                
        private TFNT_COLABORADORES mVerificaHuellaColaborador(short paEmpresa, string paCedula, int vvDedo, ref byte[] paHuella)
        {
            TFNT_COLABORADORES vvRes = null;

            dcConexionDataContext p = new dcConexionDataContext();

            p.ObjectTrackingEnabled = false;
            
            var j = from f in p.TFNT_HUELLAS
                        where f.HLL_SEMPRESA == paEmpresa && f.CLB_VID == paCedula && f.HLL_SDEDO == vvDedo
                        select f.HLL_BDATA.ToArray();

            List<byte[]> vHuellas = j.ToList();

            try
            {
                foreach (byte[] t in vHuellas)
                {
                    if (mVerificaHuella(t, ref paHuella))
                    {
                        vvRes = mConsultaColaboradorTabla(paEmpresa, paCedula);

                        break;
                    }
                }
            }
            catch
            {

            }
            finally
            {
                j = null;

                GC.Collect(GC.GetGeneration(vHuellas));
                
                vHuellas = new List<byte[]>();
                vHuellas = null;

                GC.Collect();

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public clColaboradorInfo mMarcacionTH(clDatosSesionSrv paSesionSrv, int paDataDv, byte[] paDataVer)
        {
            clMarcacionVer vvMarcacionVer = new clMarcacionVer(paDataDv, paDataVer);

            string paCedula = vvMarcacionVer.vCads[0];
            DateTime paFechaMarcacion = DateTime.Parse(vvMarcacionVer.vCads[1]);
            string paCentroCosto = vvMarcacionVer.vCads[2];
            string paTipoMovimiento = vvMarcacionVer.vCads[3];

            clColaboradorInfo vvRes = null;

            if (mValidaSesion(paSesionSrv))
            {
                TFNT_LECTORES vvLector = null;
                TFNT_COLABORADORES vvColaborador = null;

                dcConexionDataContext p = new dcConexionDataContext();

                try
                {
                    var c = from t in p.TFNT_COLABORADORES
                            where t.CLB_SEMPRESA == paSesionSrv.vEmpresa
                            && t.CLB_VID == paCedula
                            select t;

                    var y = from h in p.TFNT_LECTORES
                            where h.LEC_SEMPRESA == paSesionSrv.vEmpresa
                            && h.CDC_VID == paCentroCosto
                            && h.LEC_LRECACT == true
                            select h;

                    if (y.Count() > 0)
                    {
                        vvLector = y.First();

                        if (c.Count() > 0)
                        {
                            vvColaborador = c.First();
                        }
                    }

                }
                catch
                {
                    vvColaborador = null;
                }

                if (vvColaborador != null && vvLector != null)
                {
                    try
                    {
                        Guid vvMovimiento = Guid.Empty;

                        if (paTipoMovimiento == "E")
                        {
                            vvMovimiento = new Guid("EF2DB928-2E8B-4493-B0C3-A0408DC4181C");
                        }
                        else
                        {
                            if (paTipoMovimiento == "S")
                            {
                                vvMovimiento = new Guid("8AF4B629-DC88-4631-A841-8989BE96BE7C");
                            }
                        }

                        if (vvMovimiento != Guid.Empty)
                        {
                            var f = from t in p.TFNT_MARCACIONES
                                    where t.MRC_SEMPRESA == paSesionSrv.vEmpresa
                                    && t.CLB_VID == vvColaborador.CLB_VID
                                    && t.MRC_DFECHAMARCACION == paFechaMarcacion
                                    select t;

                            TFNT_MARCACIONES vvMarcacion = null;

                            if (f.Count() > 0)
                            {
                                vvMarcacion = f.First();

                                vvMarcacion.MMC_UID = vvMovimiento;
                                vvMarcacion.MRC_DACTFECHA = DateTime.Now;
                                vvMarcacion.MRC_VACTUSUARIO = paSesionSrv.vId;
                            }
                            else
                            {
                                vvMarcacion = new TFNT_MARCACIONES();

                                vvMarcacion.MRC_SEMPRESA = paSesionSrv.vEmpresa;
                                vvMarcacion.MRC_UID = Guid.NewGuid();
                                vvMarcacion.MRC_DFECHAMARCACION = paFechaMarcacion;
                                vvMarcacion.LEC_URECID = vvLector.LEC_URECID;
                                vvMarcacion.CLB_VID = vvColaborador.CLB_VID;
                                vvMarcacion.CLB_LMARCACIONMANUAL = true;
                                vvMarcacion.MMC_UID = vvMovimiento;
                                vvMarcacion.MRC_DCRCFECHA = DateTime.Now;
                                vvMarcacion.MRC_VCRCUSUARIO = paSesionSrv.vId;
                                vvMarcacion.MRC_DACTFECHA = DateTime.Now;
                                vvMarcacion.MRC_VACTUSUARIO = paSesionSrv.vId;

                                p.TFNT_MARCACIONES.InsertOnSubmit(vvMarcacion);
                            }

                            if (vvMarcacion != null)
                            {
                                p.SubmitChanges();

                                try
                                {
                                    p.p_graba_marcaciones_kactus(Convert.ToDecimal(vvColaborador.CLB_VID), Convert.ToInt16(vvLector.CDC_VID), vvMarcacion.MRC_DFECHAMARCACION, Convert.ToInt16(vvMarcacion.MRC_DFECHAMARCACION.Hour), Convert.ToInt16(vvMarcacion.MRC_DFECHAMARCACION.Minute), paTipoMovimiento, vvLector.LEC_URECID.ToString().Substring(0, 10));
                                }
                                catch
                                {

                                }

                                vvRes = mConsultaColaborador(paSesionSrv.vEmpresa, vvMarcacion.CLB_VID);

                                vvRes.vUltimaFechaMarcacion = vvMarcacion.MRC_DFECHAMARCACION;

                                vvRes.vUltimoMovimiento = paTipoMovimiento.ToCharArray()[0];
                            }
                        }
                    }
                    catch
                    {
                        vvRes = null;
                    }
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public bool mVerificarMaquina(short paEmpresa, int paDataDv, byte[] paDataVer)
        {
            bool vvRes = false;

            dcConexionDataContext p = new dcConexionDataContext();

            try
            {
                clMarcacionVer v1 = new clMarcacionVer(paDataDv, paDataVer);

                if (v1.vCads.Count >= 4)
                {
                    var y = from t in p.TFNT_LECTORES
                            where t.LEC_SEMPRESA == paEmpresa
                            && t.LEC_UMAC == Guid.Parse(v1.vCads[3])
                            && t.LEC_VMAC2 == v1.vCads[2]
                            && t.LEC_LRECACT == true
                            select t;

                    if (y.Count() > 0)
                    {
                        vvRes = true;
                    }
                }
            }
            catch
            {
                vvRes = false;
            }
            p.Connection.Close();
            p.Dispose();
            p = null;

            return vvRes;
        }

        public TFNT_CENTROSDECOSTO mObtieneCC(short paEmpresa, string paCC)
        {
            TFNT_CENTROSDECOSTO vvRes = null;

            paCC = paCC.Trim();

            if (paCC.Length > 0)
            {
                dcConexionDataContext p = new dcConexionDataContext();

                var n = from g in p.TFNT_CENTROSDECOSTO
                        where g.CDC_SEMPRESA == paEmpresa
                        && g.CDC_VID == paCC
                        select g;

                if (n.Count() > 0)
                {
                    vvRes = n.First();
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            GC.Collect();
            GC.Collect();

            return vvRes;
        }

        public bool mRelacionaDispositivos(clDatosSesionSrv paSesionSrv, int paDv, byte[] paVerificador, string paCC)
        {
            bool vvRes = false;

            if (mValidaSesion(paSesionSrv) && paCC.Length > 0)
            {
                bool vvLib = mLiberaDispositivos(paSesionSrv, paDv, paVerificador, paCC);

                clMarcacionVer v1 = new clMarcacionVer(paDv, paVerificador);

                if (v1.vCads.Count == 4)
                {
                    Guid vvLectorId = Guid.Empty;
                    Guid vvMaquinaId = Guid.Empty;

                    if (Guid.TryParse(v1.vCads[1], out vvLectorId) && Guid.TryParse(v1.vCads[3], out vvMaquinaId) && v1.vCads[0].Trim().Length > 0 && v1.vCads[2].Trim().Length > 0)
                    {
                        if (vvLectorId != Guid.Empty && vvMaquinaId != Guid.Empty)
                        {
                            dcConexionDataContext p = new dcConexionDataContext();

                            var y = from t in p.TFNT_LECTORES
                                    where t.LEC_SEMPRESA == paSesionSrv.vEmpresa
                                    && t.LEC_UID == vvLectorId
                                    && t.LEC_LRECACT == true
                                    select t;

                            if (y.Count() == 0)
                            {
                                var u = from t in p.TFNT_CENTROSDECOSTO
                                        where t.CDC_SEMPRESA == paSesionSrv.vEmpresa
                                        && t.CDC_VID == paCC
                                        select t;

                                if (u.Count() > 0)
                                {
                                    y = (from t in p.TFNT_LECTORES
                                         where t.LEC_SEMPRESA == paSesionSrv.vEmpresa
                                         && t.LEC_UID == vvLectorId
                                         && t.LEC_VID2 == v1.vCads[0]
                                         && t.LEC_UMAC == vvMaquinaId
                                         && t.LEC_VMAC2 == v1.vCads[2]
                                         && t.CDC_VID == paCC
                                         && t.LEC_LRECACT == false
                                         select t).OrderByDescending(x => x.LEC_DCRCFECHA);

                                    try
                                    {
                                        TFNT_LECTORES d = null;

                                        if (y.Count() > 0)
                                        {
                                            d= y.First();

                                            d.LEC_LRECACT = true;
                                        }
                                        else
                                        {
                                            d = new TFNT_LECTORES();

                                            d.LEC_SEMPRESA = paSesionSrv.vEmpresa;
                                            d.LEC_URECID = Guid.NewGuid();
                                            d.LEC_UID = vvLectorId;
                                            d.LEC_VID2 = v1.vCads[0];
                                            d.LEC_UMAC = vvMaquinaId;
                                            d.LEC_VMAC2 = v1.vCads[2];
                                            d.LEC_LRECACT = true;
                                            d.CDC_VID = paCC;
                                            d.LEC_DCRCFECHA = DateTime.Now;
                                            d.LEC_VCRCUSUARIO = paSesionSrv.vId;
                                            d.LEC_DACTFECHA = DateTime.Now;
                                            d.LEC_VACTUSUARIO = paSesionSrv.vId;

                                            p.TFNT_LECTORES.InsertOnSubmit(d);

                                            try
                                            {
                                                p.p_graba_marcadores_kactus(d.LEC_URECID.ToString().Substring(0, 10), Convert.ToInt16(d.CDC_VID), d.CDC_VID);
                                            }
                                            catch
                                            {

                                            }
                                        }

                                        p.SubmitChanges();

                                        vvRes = true;
                                    }
                                    catch (Exception n)
                                    {
                                        vvRes = false;
                                    }
                                }
                            }

                            p.Connection.Close();
                            p.Dispose();
                            p = null;
                        }
                    }
                }
            }

            return vvRes;
        }

        private bool mLiberaDispositivos(clDatosSesionSrv paSesionSrv, int paDv, byte[] paVerificador, string paCC)
        {
            bool vvRes = false;

            try
            {
                if (mValidaSesion(paSesionSrv) && paCC.Length > 0)
                {
                    clMarcacionVer v1 = new clMarcacionVer(paDv, paVerificador);

                    if (v1.vCads.Count == 4)
                    {
                        Guid vvLectorId = Guid.Empty;
                        Guid vvMaquinaId = Guid.Empty;

                        if (Guid.TryParse(v1.vCads[1], out vvLectorId) && Guid.TryParse(v1.vCads[3], out vvMaquinaId) && v1.vCads[0].Trim().Length > 0 && v1.vCads[2].Trim().Length > 0)
                        {
                            if (vvLectorId != Guid.Empty && vvMaquinaId != Guid.Empty)
                            {
                                dcConexionDataContext p = new dcConexionDataContext();

                                var y = from t in p.TFNT_LECTORES
                                        where t.LEC_SEMPRESA == paSesionSrv.vEmpresa
                                        && t.LEC_UID == vvLectorId
                                        && t.LEC_LRECACT == true
                                        select t;

                                if (y.Count() > 0)
                                {
                                    foreach (TFNT_LECTORES t in y)
                                    {
                                        t.LEC_LRECACT = false;
                                    }

                                    p.SubmitChanges();

                                    vvRes = true;
                                }

                                p.Connection.Close();
                                p.Dispose();
                                p = null;
                            }
                        }
                    }
                }
            }
            catch
            {
                vvRes = false;
            }

            return vvRes;
        }
        
        public bool mGrabaTicket(clDatosSesionSrv paSesionSrv, string paCedula)
        {
            bool vvRes = false;

            paCedula = paCedula.Trim();

            if (paCedula.Length > 0)
            {
                TFNT_SESIONESTICKETS vvSesiones = null;
                dcConexionDataContext p = new dcConexionDataContext();

                var y = from t in p.TFNT_SESIONESTICKETS
                        where t.SET_SEMPRESA == paSesionSrv.vEmpresa
                        && t.CLB_VID == paCedula
                        && t.SET_DFECHAEXPIRACION >= DateTime.Now
                        && t.SET_LCERRADO == false
                        select t;

                try
                {
                    if (y.Count() > 0)
                    {
                        vvSesiones = y.First();

                        vvSesiones.SET_DFECHAEXPIRACION = vvSesiones.SET_DFECHAEXPIRACION.Add(new TimeSpan(0, Convert.ToInt32(5 - (vvSesiones.SET_DFECHAEXPIRACION - DateTime.Now).TotalMinutes), 0));
                    }
                    else
                    {
                        var g = from t in p.TFNT_COLABORADORES
                                where t.CLB_SEMPRESA == paSesionSrv.vEmpresa
                                && t.CLB_VID == paCedula
                                && t.CLB_LMARCACIONMANUAL == false
                                select t;

                        if (g.Count() > 0)
                        {
                            vvSesiones = new TFNT_SESIONESTICKETS();

                            vvSesiones.SET_SEMPRESA = paSesionSrv.vEmpresa;
                            vvSesiones.SET_UID = Guid.NewGuid();
                            vvSesiones.CLB_VID = paCedula;
                            vvSesiones.SET_DFECHAEXPIRACION = DateTime.Now.Add(new TimeSpan(0, 5, 0));
                            vvSesiones.SET_LCERRADO = false;
                            vvSesiones.SET_DCRCFECHA = DateTime.Now;
                            vvSesiones.SET_VCRCUSUARIO = paSesionSrv.vId;
                            vvSesiones.SET_DACTFECHA = DateTime.Now;
                            vvSesiones.SET_VACTUSUARIO = paSesionSrv.vId;

                            p.TFNT_SESIONESTICKETS.InsertOnSubmit(vvSesiones);
                        }
                    }

                    p.SubmitChanges();

                    vvRes = true;
                }
                catch
                {
                    vvRes = false;
                }

                p.Connection.Close();
                p.Dispose();
                p = null;
            }

            return vvRes;
        }

        public bool mVerdadero(TFNT_CARGOS paCar)
        {
            return true;
        }

    }
    
}
